package com.itic.appbase.applications.sys.role.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itic.appbase.applications.sys.relation.persistence.dao.RoleResourceDao;
import com.itic.appbase.applications.sys.relation.persistence.dao.UserRoleDao;
import com.itic.appbase.applications.sys.relation.persistence.model.RoleResource;
import com.itic.appbase.applications.sys.role.persistence.dao.RoleDao;
import com.itic.appbase.applications.sys.role.persistence.model.Role;
import com.itic.appbase.applications.sys.role.persistence.model.RoleExample;
import com.itic.appbase.framework.common.constants.DBConst;
import com.itic.appbase.framework.common.service.CrudService;
import com.itic.appbase.framework.utils.StringHelper;

@Service
@Transactional
public class RoleService
        extends CrudService<RoleDao, Role, RoleExample> {

    @Autowired
    private RoleDao roleDao;
    @Autowired
    private RoleResourceDao roleResourceDao;
    @Autowired
    private UserRoleDao userRoleDao;

    /**
     * 添加角色并同步更新角色资源表
     * 
     * @param role
     * @param roleResourceList
     * @return
     */
    public String addRole(Role role, String resourceIds) {
        Role newRole = role;
        newRole = this.initDefalutFields(newRole);// 设置角色-6个必填字段
        List<RoleResource> roleResourceList = new ArrayList<RoleResource>();
        if (StringHelper.isNotBlank(resourceIds)) {
            String[] resources = resourceIds.split(",");
            for (int i = 0; i < resources.length; i++) {
                // 角色资源
                RoleResource roleResource = new RoleResource();
                roleResource.setRoleId(newRole.getId());// 角色id
                roleResource.setResourceId(resources[i]);// 资源ID
                roleResource = this.initDefalutFields(roleResource);// 设置角色资源-6个必填字段
                roleResourceList.add(roleResource);
            }
        }
        int i = roleDao.insert(newRole);
        if (i > 0) {
            for (RoleResource roleResource : roleResourceList) {
                int j = roleResourceDao.insert(roleResource);
                if (j < 1) {
                    return FAILED;
                }
            }
            return SUCCESS;
        }
        return FAILED;
    }

    /**
     * 删除角色信息，以及角色对应的资源信息以及用户角色表
     * 1、删除角色信息
     * 2、删除角色资源信息
     * 3、删除用户角色信息
     * 
     * @return
     */
    public String deleteRole(Role role, RoleExample roleExample, List<String> idList) {
        String result = FAILED;
        // 1、逻辑删除角色信息
        int updateRoleCount = roleDao.updateByExampleSelective(role, roleExample);
        if (updateRoleCount > 0) {// 逻辑删除角色的数量大于0，删除成功
            result = SUCCESS;
            // 配置sqlmap变量
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("dbTrue", DBConst.TRUE);// 可用的代码表
            map.put("idList", idList);// 角色id组成的list集合
            // 2、物理删除角色资源信息
            int deleteResourceCount = roleResourceDao.deleteResourceByRoleId(map);
            if (deleteResourceCount < 0) {// 物理删除数量不小于0，删除成功
                return FAILED;
            } else {
                // 3、物理删除用户角色信息
                int deleteUserCount = userRoleDao.deleteUserRoleByRoleIds(map);
                if (deleteUserCount < 0) {// 物理删除角色的数量大于0，删除成功
                    return FAILED;
                }
            }
        }
        return result;
    }
}